Pular para o conteúdo principal

Controle MQTT agendado

dica

O controle MQTT agendado é destinado a mensagens agendadas com antecedência. Para controle ao vivo, veja Controle MQTT Ao Vivo em vez disso.

Este guia irá ajudá-lo a configurar o MQTT em seu SmartgridOne Controller para controlar e monitorar remotamente instalações de baterias e painéis solares.

O que você precisa

  1. SmartgridOne Controller com conectividade à internet.
  2. Credenciais MQTT: Isso pode ser solicitado enviando um e-mail para support@eniris.be.
  3. Ambiente de desenvolvimento Python (ou qualquer outro cliente MQTT). Este guia usa um exemplo básico escrito em Python para ajudá-lo a começar com o MQTT e o envio de comandos. Recomendamos o uso do Python pela facilidade de uso, mas qualquer outro cliente MQTT é suportado.

Informações extras

MQTT é um protocolo de comunicação rápido pela internet. É um sistema de mensagens de publicação/assinatura, que permite uma conexão direta entre sua máquina e o SmartgridOne Controller. Seus ativos são classificados em grupos de solar, bateria, EV e HVAC. No momento, essa integração permite controle por grupo, não por dispositivo.

Configuração inicial (Ponto de partida para novos usuários)

Tenho um SmartgridOne Controller que gostaria de configurar para Controle Remoto MQTT.

1. Verifique sua rede

Certifique-se de que sua rede permite tráfego de rede MQTT pela porta 1883. Você pode fazer isso usando o comando:

nc -zv mqtt.eniris.be 1883

Quando esse comando não estiver disponível, você pode alternativamente baixar e executar este código python.

Em caso de dúvida, consulte seu engenheiro de rede ou use temporariamente o hotspot 4G/5G do seu telefone quando ocorrerem erros de conexão.

nota

Quando a porta 1883 não estiver acessível a partir da sua rede, oferecemos um backup na porta 80. Isso pode ser configurado no seu cliente MQTT em um passo posterior neste manual.

2. Adicione seus dispositivos

Faça login na interface de comissionamento e certifique-se de que os dispositivos estão adicionados ao SmartgridOne Controller.

3. Adicione o sinal externo MQTT

Imagem 1
Imagem 1
Imagem 1

4. Ative o sinal remoto MQTT

Selecione todos os dispositivos que você deseja incluir no Controle Remoto MQTT.

Imagem 1

5. Sinal remoto adicionado

A interface de Controle Remoto MQTT agora foi ativada no SmartgridOne Controller.

Estamos agora prontos para enviar alguns comandos básicos usando um exemplo simples. A coluna Status informa se algum comando está ativo.

Script de demonstração em Python

Um bom ponto de partida seria testar sua nova integração configurando um exemplo simples.

Este código de teste faz um trabalho simples de enviar continuamente o seguinte cronograma:

  • Bateria: Carregar a 5 kW por 15 minutos em 10 minutos
  • Solar: Definir potência para 0 kW por uma hora em 30 minutos

O SmartgridOne Controller responde com uma mensagem de reconhecimento contendo o identificador exclusivo do cronograma, ou uma mensagem de erro.

A seguir, buscamos o próximo cronograma para ambos os tipos de dispositivos, confirmando que o comando foi bem-sucedido.

Por favor, baixe o arquivo abaixo em sua IDE Python preferida. Preencha seu número de série e credenciais MQTT e execute o script:

Quando o acima é bem-sucedido, você pode continuar enviando outros tipos de mensagens. Todas as mensagens são descritas abaixo.

Documentação MQTT para Envio de Comandos

Esta seção detalha o formato de mensagens MQTT e os requisitos de carga útil para configurar o controle agendado de dispositivos dentro da rede do SmartgridOne Controller.

Tópicos MQTT

  • Tópico de Assinatura: standard1/rp_one_s/remoteScheduleMetrics/<controller SN>
  • Tópico de Feedback: standard1/outbound/remoteScheduleMetrics/feedback/<controller SN>

Onde <controller SN> deve ser substituído pelo número de série real do SmartgridOne Controller que você pretende controlar.

Tipos de Mensagens MQTT

1. Definir Cronograma (set_schedule)

Cria um novo cronograma para um tipo de dispositivo.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint em watts>,
"remove_overlap": <True/False> (Opcional) (default=False),
"tag": <Tag String> (Opcional) (default=None),
}
}

Resposta (Sucesso):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedule_ack",
"state": {
"schedule_id": <Schedule ID>,
"deleted_ids": <Schedulde IDs deleted if remove_overlap=True>
"tag": <Tag String> (default=None),
},
"responseCode": 0
}
}

2. Definir Cronogramas (set_schedules)

Cria vários novos cronogramas.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedules",
"fields":
"0": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint em watts>,
"remove_overlap": <True/False> (Opcional) (default=False),
},
"1": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint em watts>,
"remove_overlap": <True/False> (Opcional) (default=False),
},
...
}

Resposta (Sucesso):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedules_ack",
"state": {
"schedule_ids": <Schedule IDs>,
"deleted_ids": <Schedulde IDs deleted if remove_overlap=True>
},
"responseCode": 0
}
}

3. Obter Cronograma (get_schedule)

Recupera um cronograma específico pelo ID.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedule",
"fields": {
"id": <Schedule ID>
}
}

Resposta:

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

4. Obter Cronograma Ativo (get_active_schedule)

Recupera o cronograma atualmente ativo para um tipo de dispositivo.

{
"extraTags": {
```json
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_active_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
}
}

Resposta (Sucesso):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_active_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

5. Obter Próximo Horário (get_next_schedule)

Recupera o próximo horário disponível para um tipo de dispositivo.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_next_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
}
}

Resposta (Sucesso):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_next_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

6. Obter Horários (get_schedules)

Recupera todos os horários para uma data específica.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedules",
"fields": {
"date": "<Date String of Format dd/mm/yyyy>"
}
}

Resposta (Sucesso):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}

7. Obter Horários Futuros (get_future_schedules)

Recupera todos os horários futuros.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_future_schedules",
"fields": {}
}

Resposta (Sucesso):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_future_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}

8. Remover Horário (remove_schedule)

Remove um horário específico pelo ID.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "remove_schedule",
"fields": {
"id": <Schedule ID>
}
}

Resposta (Sucesso):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "remove_schedule_ack",
"state": "Horário <Schedule ID> removido com sucesso",
"responseCode": 0
}
}

9. Obter Feedback do Site (get_feedback)

Recupera feedback detalhado sobre o estado do sistema.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_feedback",
"fields": {
"device": <Device (node) level>
}
}

Resposta (Sucesso):

Estrutura do Payload de Feedback

10. Topologia do Site (get_toplogy)

Obtém a topologia do site.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_topology",
"fields": {}
}

Resposta (Sucesso):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_topology_ack",
"state": {
"nodeId": <nodeId>,
"nodeType": <nodeType>,
"children": [{<ChildObject>}]
},
"responseCode": 0
}
}

Formato Padrão de Resposta de Horário

{
"id": <Schedule ID>,
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Opcional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Schedule Policy>",
"power_setpoint_w": <Setpoint in watts>,
"created_at": <Unix Timestamp>
}

Tipos de Componentes e Políticas

Para detalhes sobre os componentes disponíveis e políticas que podem ser agendadas, consulte a seção Componentes e Políticas MQTT na documentação de Controle MQTT ao Vivo.

Horários específicos do dispositivo podem ser enviados usando o campo opcional node_id, referindo-se ao ID do nó do dispositivo controlável.

Tratamento de Erros

Todas as mensagens podem retornar uma resposta de erro com responseCode: 1 quando um erro ocorrer:

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "<Message Type>_ack",
"error": <Error Body>,
"responseCode": 1
}
}

Quando ocorre um erro não relacionado, o tipo de mensagem será (general_error).

Erros comuns incluem:

  • Sobreposição de horários com horários existentes
  • Intervalo de tempo inválido
  • Tipo de dispositivo não encontrado
  • ID do horário não encontrado
  • Política inválida para o tipo de dispositivo

Regras de Gerenciamento de Horários

  1. Regras de Sobreposição
    • Horários não podem se sobrepor para o mesmo tipo de dispositivo
    • Horários não podem se sobrepor para o mesmo dispositivo
    • Horários para o mesmo dispositivo e tipo de dispositivo não podem se sobrepor
    • Horários existentes, que se sobrepõem, serão excluídos se a variável remove_overlap estiver definida como True ao criar um novo horário.
  2. Cada horário deve ter:
    • Um tipo de dispositivo válido
    • Um horário de início (timestamp Unix)
    • Um horário de término (timestamp Unix)
    • Uma política (correspondendo às políticas disponíveis do tipo de dispositivo)
    • Um setpoint de potência (para políticas que exigem isso)
  3. O horário de início deve ser antes do horário de término
  4. Se o horário de início estiver no passado, ele é automaticamente alterado para iniciar agora
  5. Horários só podem ser excluídos se ainda não tiverem começado. Horários ativos não podem ser excluídos.
  6. Horários podem ser configurados para diferentes tipos de dispositivos de forma independente
  7. O sistema aplica automaticamente a política apropriada quando um horário se torna ativo